package org.zxyj.core.utils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件工具类
 * 
 * @author liaochente
 * 
 */
public class FileUtil {

	/**
	 * 每一个文件上传到DFS后，都会生成groupId。
	 * 文件上传KEY---- groupId
	 */
	public static final String GROUP_ID = "groupId";
	
	/**
	 * 表明文件是否上传成功
	 * 文件上传KEY---- returnCode
	 */
	public static final String RETURN_CODE = "returnCode";
	
    /**
     * 从文件名中获取扩展名
     * 
     * @param originalFilename
     *            文件名
     * @return
     */
    public static String getExtName(String originalFilename) {
        if (originalFilename == null) {
            throw new NullPointerException("originalFilename is null");
        }
        Pattern pattern = Pattern.compile("^.*\\.\\w+$");
        Matcher matcher = pattern.matcher(originalFilename);
        if (!matcher.matches()) {
            throw new IllegalArgumentException("originalFilename 文件名格式不正确，无法获取正确的扩展名");
        }
        String[] arrs = originalFilename.split("\\.");
        String type = arrs[arrs.length - 1];
        return type.toLowerCase();
    }
    
    /**
     * 此方法描述的是：   上传文件到fastDFS
     * @author: mada  
     * @version: 2015-11-24 下午3:27:04   
     * @param files MultipartFile    数组
     * @return List groupId的集合
     * @throws IOException 
     */
    public static List<Map<String, Object>> uploadFilesToDFS(MultipartFile[] files) throws IOException {
    	List<Map<String, Object>> groupIds = new ArrayList<Map<String, Object>>();
    	if (files != null) {
    		
    	}
    	
    	return groupIds;
    }
    
    /**
     * 此方法描述的是：   上传文件到fastDFS
     * @author: mada  
     * @version: 2015-11-24 下午3:27:04   
     * @param files MultipartFile      集合
     * @return List groupId的集合
     * @throws IOException 
     */
    public static List<Map<String, Object>> uploadFilesToDFS(List<MultipartFile> files) throws IOException {
    	List<Map<String, Object>> groupIds = new ArrayList<Map<String, Object>>();
    	if (files != null) {
    		
    	}
    	
    	return groupIds;
    }
    
    /** 
     * 根据路径删除指定的目录或文件，无论存在与否 
     *@param path  要删除的目录或文件 
     */  
    public static void deleteDir(String path) {
    	if(StringUtils.isNotEmpty(path)){
	        File file = new File(path);
	        // 判断目录或文件是否存在
	        if (file.exists()) {
	            // 判断是否为文件
	            if (file.isFile()) {
	                deleteFile(path);// 为文件时调用删除文件方法
	            } else {
	                deleteDirectory(path);// 为目录时调用删除目录方法
	            }
	        }
    	}
    }
    
    /**
	 * 删除磁盘上存储的文件
	    * @Title: deleteFile
	    * @param @param url    参数
	    * @return void    返回类型
	    * @throws
	 */
	public static void deleteFile(String path){
		if(StringUtils.isNotEmpty(path)){
			File file = new File(path);
			//判断文件是否存在
	        if (file.exists()){
	            file.delete();
	        }
		}
	}
	
	/** 
     * 删除目录（文件夹）以及目录下的文件 
     * @param   path 被删除目录的文件路径 
     */  
    public static void deleteDirectory(String path) {
    	if(StringUtils.isNotEmpty(path)){
	        //如果sPath不以文件分隔符结尾，自动添加文件分隔符
	        if (!path.endsWith(File.separator)) {
	        	path = path + File.separator;
	        }
	        
	        File file = new File(path);
	        //如果dir对应的文件不存在，或者不是一个目录，则退出
	        if (file.exists() || file.isDirectory()) {
	        	//删除文件夹下的所有文件(包括子目录)
		        File[] files = file.listFiles();
		        for (int i = 0; i < files.length; i++) {
		            if (files[i].isFile()) {
		                deleteFile(files[i].getAbsolutePath());//删除子文件
		            } else {
		                deleteDirectory(files[i].getAbsolutePath());//删除子目录
		            }
		        }
	        }
	        file.delete();//删除当前目录
    	}
    }
    
	/**
	 * 判断目录是否存在，不存在则创建
	    * @Title: createDir
	    * @param @param path    参数
	    * @return void    返回类型
	    * @throws
	 */
	public static void createDir(String path){
		if(StringUtils.isNotEmpty(path)){
			File file_ = new File(path);
	        if (!file_.exists()){
	            file_.mkdirs();
	        }
		}
	}
	
	/****
     * 解压
     * @param filePath zip文件路径
     * @param outPath  解压的目的地点
     * @param folderName 文件名
     * @throws IOException 
     * @throws ClientProtocolException 
     */
    public static String unZip(String fileId,String filePath, String outPath) {
         File zipFile = new File(filePath);
         if (!zipFile.exists()){
             System.out.println("附件不存在！");
             return "";
         }
         File outFile = new File(outPath);
         if (!outFile.exists()){
             outFile.mkdirs();
         }
         Project proj = new Project();
         Expand expand = new Expand();
         expand.setProject(proj);
         expand.setTaskType("unzip");
         expand.setTaskName("unzip");
         expand.setSrc(zipFile);
         expand.setDest(new File(outPath));
         expand.setEncoding("GBK");
         try{
             expand.execute();
             return outPath;
         }catch(Exception e){
             return "";
         }
    }
    
    
}
